﻿#ifndef LOGINFOMODEL_H
#define LOGINFOMODEL_H
#include <QAbstractListModel>
#include <QObject>
#include <QDateTime>

//存储单个日志信息
class LogInfo
{
public:
    // 构造函数，初始化日志信息
    LogInfo(QString eventType,QDateTime date,double totalV,double totalI,qint8 temp,
            quint32 cap,quint32 leftCap,QByteArray bmsStatus,bool deleteLog=false);



    // 获取事件类型
    QString eventType() const;
    // 设置事件类型
    void setEventType(const QString &eventType);

    // 获取日期
    QDateTime date() const;
    // 设置日期
    void setDate(const QDateTime &date);

    // 获取总电压
    double totalV() const;
    // 设置总电压
    void setTotalV(double totalV);

    // 获取总电流
    double totalI() const;
    // 设置总电流
    void setTotalI(double totalI);

    // 获取温度
    qint8 temp() const;
    // 设置温度
    void setTemp(const qint8 &temp);

    // 获取容量
    quint32 cap() const;
    // 设置容量
    void setCap(const quint32 &cap);

    // 获取剩余容量
    quint32 leftCap() const;
    // 设置剩余容量
    void setLeftCap(const quint32 &leftCap);

    // 获取BMS状态
    QByteArray bmsStatus() const;
    // 设置BMS状态
    void setBmsStatus(const QByteArray &bmsStatus);



    // 获取是否删除日志的标志
    bool deleteLog() const;
    // 设置是否删除日志的标志
    void setDeleteLog(bool deleteLog);

private:
    QString m_eventType;// 事件类型
    QDateTime m_date;// 日期
    double m_totalV;// 总电压
    double m_totalI;// 总电流
    qint8 m_temp;// 温度
    quint32 m_cap;// 容量
    quint32 m_leftCap;// 剩余容量
    QByteArray m_bmsStatus;// BMS状态
    bool m_deleteLog;// 是否删除日志的标志
};

// LogInfoModel类继承自QAbstractListModel，用于管理日志信息列表
class LogInfoModel : public QAbstractListModel
{
    Q_OBJECT
public:
    // 定义LogInfoRoles枚举，用于数据访问和表示
    enum LogInfoRoles {
        deleteRole= Qt::UserRole + 1,// 删除日志的角色
        eventTypeRole,// 事件类型的角色
        dateRole,// 日期的角色
        totalVRole,// 总电压的角色
        totalIRole,// 总电流的角色
        tempRole,// 温度的角色
        capRole,// 容量的角色
        leftCapRole,// 剩余容量的角色
        bmsStatusRole// BMS状态的角色

    };

    // 构造函数，接受一个父对象
    explicit LogInfoModel(QObject *parent = 0);
    //Q_INVOKABLE void addLogInfo(QString eventType,QString date,double totalV,double totalI,qint8 temp,
    //quint32 cap,quint32 leftCap,QByteArray bmsStatus);
    // 添加所有日志信息到模型
    Q_INVOKABLE void addAllLogInfo(QList<LogInfo>& logInfoList);
    // 添加单个日志信息到模型
    Q_INVOKABLE void addShowLogInfo(LogInfo& logInfo);

    // 清除模型中的所有日志信息
    Q_INVOKABLE void clear();

    // 获取起始年份
    Q_INVOKABLE int getStartYear();
    // 获取结束年份
    Q_INVOKABLE int getStopYear();

    // 获取需要显示的日志数量
    Q_INVOKABLE int getNeedLog(QString startTime,QString stopTime);
    // getRxLog函数用于获取接收到的日志数量
    Q_INVOKABLE int getRxLog();

    // recordDeleteLog函数用于记录要删除的日志，其中rowNo是日志在模型中的行号，pageNo是日志在页码中的位置，status是是否按下删除按钮的标志，showFlag区分是全部还是筛选的数据
    Q_INVOKABLE void recordDeleteLog(int rowNo,int pageNo,bool status,int showFlag);//记录要删除的日志，pageFlag：在筛选页按下还是显示页按下
    // showDeleteLog函数用于显示要删除的日志
    Q_INVOKABLE void showDeleteLog();

    Q_INVOKABLE void deleteSelect(int pageNo,int showFlag);  //删除选中的日志
    Q_INVOKABLE void deleteAll(int pageNo,int showFlag);  //删除全部日志，showFlag区分是qu全部还是筛选的

    // getDeleteLog函数用于获取是否删除日志的标志，其中rowNo是日志在模型中的行号，pageNo是日志在页码中的位置，showFlag区分是全部还是筛选的数据
    Q_INVOKABLE bool getDeleteLog(int rowNo,int pageNo,int showFlag);


    // showLogInfoClear函数用于清除显示的日志信息
    void showLogInfoClear();
    // addFilterLogInfo函数用于添加过滤后的日志信息
    void addFilterLogInfo(QList<LogInfo>&);


    // getPage函数用于获取指定页的数据，其中pageNo是页码，showFlag区分是全部还是筛选的数据
    Q_INVOKABLE void getPage(int pageNo,int showFlag);//得到那一页的数据  //showFlag 为0，显示的是所有的数据  为1，显示的是筛选的数据

    Q_INVOKABLE void clearShow();//清除显示

    // rowCount函数用于返回模型中的行数
    int rowCount(const QModelIndex & parent = QModelIndex()) const;

    // data函数用于返回指定模型索引和角色的数据
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
signals:
    void  readLogOnePage();// 读取日志一页的信号
    void  readLogTotalPage(quint32 cnt);//日志的总页数
    void  showLogCnt(quint32 cnt);// 显示日志数量的信号

public slots:
protected:
    // 保护的私有槽函数，用于返回角色名称映射
    QHash<int, QByteArray> roleNames() const;
private:
    // 日志信息列表
    QList<LogInfo> m_logInfo;
    // 过滤后的日志信息列表
    QList<LogInfo> m_filterLogInfo;

    QList<int> m_filterIndex;//筛选的日志对应的m_logInfo中的索引值，以方便删除
    // 显示的日志信息列表
    QList<LogInfo> m_showLogInfo;
    // 显示的日志中要删除的日志的索引
    QList<int> m_showLogInfoDelete;
    // 记录要删除的日志，用于批量删除
    QMap<QList<int>,bool> m_recordDeleteLog;//bool 按下为true  未按下为false

    int m_startYear;// 起始年份
    int m_stopYear;// 结束年份

};

#endif // LOGINFOMODEL_H
